﻿using MultiLang;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;

namespace Rsdn.Scintilla
{
	partial class ScintillaEditor
	{
		/// <summary>
		/// TODO : в перспективе придумать более продвинутую механику выбора сепаратора.
		/// </summary>
		private const char _autoCompleteSeparator = ' ';

		/// <summary>
		/// Признак активности автокомплита.
		/// </summary>
		public bool AutocompleteActive
		{
			get { return SendEditor(ScintillaCommand.SCI_AUTOCACTIVE) != 0; }
		}

		/// <summary>
		/// Игнорировать регистр. 
		/// </summary>
		[DefaultValue(false)]
		public bool AutocompleteIgnoreCase
		{
			get { return SendEditor(ScintillaCommand.SCI_AUTOCGETIGNORECASE) != 0; }
			set { SendEditor(ScintillaCommand.SCI_AUTOCSETIGNORECASE, value); }
		}

		/// <summary>
		/// Вызывается перед завершением выбора из списка автокомплита.
		/// </summary>
		public event EventHandler<AutocompleteSelectedEventArgs> AutocompleteSelected;

		/// <summary>
		/// Вызывает событие <see cref="AutocompleteSelected"/>
		/// </summary>
		protected virtual void OnAutocompleteSelected(AutocompleteSelectedEventArgs args)
		{
			if (AutocompleteSelected == null)
				return;
			AutocompleteSelected(this, args);
			if (args.Cancel)
				CancelAutocomplete();
		}

		/// <summary>
		/// Отобразить список автодополнения.
		/// </summary>
		public void ShowAutocomplete(int enteredCount, IEnumerable<string> variants)
		{
			var sb = new StringBuilder();
			foreach (var variant in variants)
			{
				if (variant.IndexOf(_autoCompleteSeparator) >= 0)
					throw new ApplicationException(ml.ml_string(7, "Вариант не может содержать пробелы"));
				if (sb.Length > 0)
					sb.Append(_autoCompleteSeparator);
				sb.Append(variant);
			}
			SendEditor(ScintillaCommand.SCI_AUTOCSHOW, enteredCount, sb.ToString());
		}

		/// <summary>
		/// Отменяет автокомплит.
		/// </summary>
		public void CancelAutocomplete()
		{
			SendEditor(ScintillaCommand.SCI_AUTOCCANCEL);
		}
	}
}
